/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package views;

import entities.Usuarios;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;
import java.util.*;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import logica.EstadisticaMontoMensual;
import logica.Graficador;

/**
 *
 * @author root
 */
public class GraficadorEstadisticaIngresosMensuales {

    public static JFrame frame;
    private Usuarios usuario;

    public JFrame getFrame() {
        return frame;
    }

    public void setFrame(JFrame frame) {
        GraficadorEstadisticaIngresosMensuales.frame = frame;
    }

    public GraficadorEstadisticaIngresosMensuales(Usuarios usuario) {
        this.usuario = usuario;
    }

    public static void main(Usuarios usuario) {
        EntityManager entityManager = entityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("SIAATPU").createEntityManager();
        Query query;
        List<EstadisticaMontoMensual> valores = new ArrayList();
        Map<String, Double> mapValores = new HashMap<String, Double>();

        Double result;
        int nMeses = 3;
        String meses;
        boolean error = false;

        /*
         * query = entityManager.createNativeQuery("" + "SELECT
         * MONTH(a.fechaArribo) mes\n" + "FROM alquiler.alquileres a\n" + "GROUP
         * BY MONTH(a.fechaArribo);");
         */

        do {
            meses = JOptionPane.showInputDialog(null, "Ingrese la cantidad de meses de la estadística que desea saber", "Estadística Cantidad de Alquileres", JOptionPane.INFORMATION_MESSAGE);
            if (meses != null) {
                if (!meses.equals("")) {
                    try {
                        nMeses = Integer.parseInt(meses);
                        error = (nMeses > 0) ? false : true;
                    } catch (NumberFormatException nfe) {
                        error = true;
                    }
                } else {
                    error = false;
                }
            } else {
                error = false;
            }
        } while (error);
        Calendar fecha = Calendar.getInstance();
        String fechaString = fecha.get(Calendar.YEAR) + "-" + (fecha.get(Calendar.MONTH) + 1) + "-" + fecha.get(Calendar.DATE);

        query = entityManager.createNativeQuery(""
                + "SELECT MONTH(a.fechaArribo) mes\n"
                + "FROM alquiler.alquileres a\n"
                + "WHERE ((MONTH(a.fechaArribo) > (MONTH('" + fechaString + "') - " + nMeses + ")) AND (MONTH(a.fechaArribo) <= MONTH('" + fechaString + "')))"
                + "GROUP BY MONTH(a.fechaArribo);");

        List<Integer> mesesEstadistica = (List<Integer>) query.getResultList();

        query = entityManager.createNativeQuery(""
                + "SELECT sum(a.montoTotal) montoTotal\n"
                + "FROM alquiler.alquileres a\n"
                + "GROUP BY MONTH(a.fechaArribo);");

        List<BigDecimal> montosEstadistica = (List<BigDecimal>) query.getResultList();
        List<String> clavesMap = new ArrayList<String>();

        for (int i = 0; i < mesesEstadistica.size(); i++) {
            valores.add(new EstadisticaMontoMensual(mesesEstadistica.get(i).intValue(), montosEstadistica.get(i).intValue()));
            result = mapValores.put(Graficador.meses[mesesEstadistica.get(i) - 1], new Double(montosEstadistica.get(i).doubleValue()));
            clavesMap.add(Graficador.meses[mesesEstadistica.get(i) - 1]);
        }

        //mapValores, clavesMap[], tituloFrame
        frame = Graficador.barras(mapValores, clavesMap, "Ingresos Mensuales", "Ingresos Mensuales - Ultimos " + nMeses + " meses", "Ingresos Mensuales ($)", "Mes");
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                if (frame != null) {
                    frame.setVisible(false);
                }
                frame = null;
            }
        });
    }
}